/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.util.*;
import javax.persistence.EntityManager;
import java.io.*;
import java.security.*;


/**
 *
 * @author Carlos
 */

public class SocialFP implements Serializable{

   ArrayList<Usuario> usuarios;

   
   public SocialFP(){
       usuarios=new ArrayList();
       
   }
   
   public void recuperaUjaenSocial()throws Exception{
       
       EntityManager em = GestorPersistencia.instancia().getEntityManager(); 
       usuarios = (ArrayList)em.createQuery("from Usuario").getResultList();
      
   }//Recupera la red social de disco*/
   
   
   public void salvar(Usuario u) throws Exception, ErrorActualizacionUser{
      
       
       DAOUser.instancia().actualizar(u);
       
      
   }   //Salva la red social en disco*/

    public void nuevoUsuario (Usuario u) throws Exception, ErrorCreacionUser {
            
        //primero busco por si el usuario ya existe
        Usuario u1;
        Exception ex;
        ex=new Exception();
        u1=new Usuario();
        Iterator itera = usuarios.listIterator();
      		while(itera.hasNext())
		{
			u1=(Usuario) itera.next();
			if ((u.leeEmail().equals(u1.leeEmail()))){
                           throw ex;
                        } 
                }
        // Si no existe, añado el usuario a la red
        usuarios.add(u);  
        DAOUser.instancia().crear(u);
            
    }//Añade un usuario a la red social
   
    public Collection todosUsuarios(){
       Collection <Usuario> c;
       c = new ArrayList<Usuario>();
       Usuario u;
       Iterator itera = usuarios.listIterator();
      		while(itera.hasNext())
		{
			u=(Usuario) itera.next();
                        c.add(u);
                        
                }
         
      return c;
    }
    public Collection buscarUsuarios(String termino){
        Collection <Usuario> c;
        c = new ArrayList<Usuario>();  
        Usuario u;
        //Buscamos en el nombre y en la descripcion a la vez
        Iterator itera = usuarios.listIterator();
      		while(itera.hasNext())
		{
			u=(Usuario) itera.next();
			if ((u.leeNombre().indexOf(termino)!=-1||(u.leeDescripcion().indexOf(termino)!=-1))){
                            c.add(u);
                        }
                }
         
          return c;
    }//Devuelve una colección  de usuarios que coinciden con la búsqueda
    
    public Usuario buscarUsuarioEmail(String aemail){
        Usuario u;
        u=new Usuario();
        Iterator itera = usuarios.listIterator();
      		while(itera.hasNext())
		{
			u=(Usuario) itera.next();
			if ((u.leeEmail().equals(aemail))){
                           return u;
                        } 
                }
                return null;
    }//Busca a un usuario, dado un email
    
 
    public Usuario loginUsuario (String aemail,String aclave) {
        Usuario u;
        String clave;
        //clave=CodificaMD5(aclave);
            Iterator itera = usuarios.listIterator();
      		while(itera.hasNext())
		{
			u=(Usuario) itera.next();
			if ((u.leeEmail().equals(aemail))){
                            if (u.clavevalida(aclave)){
                            return u;
                         }else{   
                             return null;
                         }
                         }
                }
                
                return null;
      }//Este proceso va a devolver el usuario correspondiente, 
    
    private static char[] BASEHEX = { '0', '1', '2', '3',
        '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    public  String CodificaMD5(String aclave)  {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5"); 
            byte[] bytes = md.digest(aclave.getBytes());
            StringBuilder sb = new StringBuilder(2 * bytes.length);
            for (int i = 0; i < bytes.length; i++) {
                int low = (int)(bytes[i] & 0x0f);
                int high = (int)((bytes[i] & 0xf0) >> 4);
                sb.append(BASEHEX[high]);
                sb.append(BASEHEX[low]);
            }
           
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }//Codifica un String a md5
}
